#pragma once
#include"Singleton.h"

class Mario;

class MarioState {
public:
    virtual void GotMushroom(Mario* mario) = 0;
    virtual void GotFireFlower(Mario* mario) = 0;
    virtual void GotFeather(Mario* mario) = 0;
    virtual void MetMonster(Mario* mario) = 0;
};

class Mario {
private:
    MarioState* state;
    int coin;
    int life = 1;

public:
    Mario();
    void SetState(MarioState* state);

public:
    void SetCoin(int numberOfCoins);
    void ReportCoin();

public:
    void GotMushroom();
    void GotFireFlower();
    void GotFeather();
    void MetMonster();
    void GameOver();
    int Flag();
};

class SmallMario : public MarioState, public Singleton<SmallMario> {
public:
    void GotMushroom(Mario* mario);
    void GotFireFlower(Mario* mario);
    void GotFeather(Mario* mario);
    void MetMonster(Mario* mario);
};

class SuperMario : public MarioState, public Singleton<SuperMario> {
public:
    void GotMushroom(Mario* mario);
    void GotFireFlower(Mario* mario);
    void GotFeather(Mario* mario);
    void MetMonster(Mario* mario);
};

class FireMario : public MarioState, public Singleton<FireMario> {
public:
    void GotMushroom(Mario* mario);
    void GotFireFlower(Mario* mario);
    void GotFeather(Mario* mario);
    void MetMonster(Mario* mario);
};

class CapeMario:public MarioState, public Singleton<CapeMario> {
public:
    void GotMushroom(Mario* mario);
    void GotFireFlower(Mario* mario);
    void GotFeather(Mario* mario);
    void MetMonster(Mario* mario);
};